home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Language/OS - Multiplatform Resource Library
/
LANGUAGE OS.iso
/
a_utils
/
_archvrs
/
unix
/
unzip51
/
envargs.c
< prev
next >
Wrap
C/C++ Source or Header
|
1992-11-04
|
3KB
|
130 lines
/*****************************************************************
| envargs - add default options from environment to command line
|----------------------------------------------------------------
| Author: Bill Davidsen, original 10/13/91, revised 23 Oct 1991.
| This program is in the public domain.
|----------------------------------------------------------------
| Minor program notes:
| 1. Yes, the indirection is a tad complex
| 2. Parenthesis were added where not needed in some cases
| to make the action of the code less obscure.
| 3. Set tabsize to four to make this pretty
|----------------------------------------------------------------
| UnZip notes 24 May 92 ("v1.4"):
| 1. #include "unzip.h" for prototypes
| 2. changed ch to type char
| 3. added an ifdef to avoid Borland warnings
*****************************************************************/
#include "unzip.h"
static int count_args __((char *));
static void mem_err __((void));
#if (defined(SCCS) && !defined(lint)) /* causes warnings: annoying */
static char *SCCSid = "@(#)envargs.c 1.3 23 Oct 1991";
#endif
void
envargs(Pargc, Pargv, envstr)
int *Pargc;
char ***Pargv;
char *envstr;
{
char *getenv();
char *envptr; /* value returned by getenv */
char *bufptr; /* copy of env info */
int argc = 0; /* internal arg count */
char ch; /* spare temp value */
char **argv; /* internal arg vector */
char **argvect; /* copy of vector address */
/* see if anything in the environment */
envptr = getenv(envstr);
if (envptr == (char *)NULL || *envptr == 0) return;
/* count the args so we can allocate room for them */
argc = count_args(envptr);
bufptr = (char *)malloc(1+strlen(envptr));
if (bufptr == (char *)NULL) mem_err();
strcpy(bufptr, envptr);
/* allocate a vector large enough for all args */
argv = (char **)malloc((argc+*Pargc+1)*sizeof(char *));
if (argv == (char **)NULL) mem_err();
argvect = argv;
/* copy the program name first, that's always true */
*(argv++) = *((*Pargv)++);
/* copy the environment args next, may be changed */
do {
*(argv++) = bufptr;
/* skip the arg and any trailing blanks */
while (((ch = *bufptr) != '\0') && ch != ' ') ++bufptr;
if (ch == ' ') *(bufptr++) = '\0';
while (((ch = *bufptr) != '\0') && ch == ' ') ++bufptr;
} while (ch);
/* now save old argc and copy in the old args */
argc += *Pargc;
while (--(*Pargc)) *(argv++) = *((*Pargv)++);
/* finally, add a NULL after the last arg, like UNIX */
*argv = (char *)NULL;
/* save the values and return */
*Pargv = argvect;
*Pargc = argc;
}
static int
count_args(s)
char *s;
{
int count = 0;
char ch;
do {
/* count and skip args */
++count;
while (((ch = *s) != '\0') && ch != ' ') ++s;
while (((ch = *s) != '\0') && ch == ' ') ++s;
} while (ch);
return count;
}
static void
mem_err()
{
perror("Can't get memory for arguments");
exit(2);
}
#ifdef TEST
main(argc, argv)
int argc;
char **argv;
{
int i;
printf("Orig argv: %p\n", argv);
dump_args(argc, argv);
envargs(&argc, &argv, "ENVTEST");
printf(" New argv: %p\n", argv);
dump_args(argc, argv);
}
dump_args(argc, argv)
int argc;
char *argv[];
{
int i;
printf("\nDump %d args:\n", argc);
for (i=0; i<argc; ++i) {
printf("%3d %s\n", i, argv[i]);
}
}
#endif